package com.hxzy.common;


import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hxzy.util.DateUtils;
import com.hxzy.util.StringUtil;
import com.hxzy.common.dto.PageDTO;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @Description:
 * @Author: ykj
 * @Date: 2022/2/26 16:13
 */
public class BaseServlet extends HttpServlet {

    //1.分页
    protected void startPage(HttpServletRequest req){
        //当前是第几页
        PageDTO pageDTO=new PageDTO();
        String page=req.getParameter("page");
        if (StringUtil.isNotBlank(page) && StringUtil.isIntGtZore(page)){
            pageDTO.setPage(Integer.parseInt(page));
        }else {
            pageDTO.setPage(1);
        }
        String size = req.getParameter("size");
        if (StringUtil.isNotBlank(size) && StringUtil.isIntGtZore(size)){
            pageDTO.setSize(Integer.parseInt(size));
        }else {
            pageDTO.setSize(10);
        }
        //调用业务逻辑层，开始分页
        PageHelper.startPage(pageDTO.getPage(), pageDTO.getSize());
    }


    /**
     * 接收post请求，参数为json Content-Type: application/json
     * @param req
     * @param tClass
     * @param <T>
     * @return
     * @t
     */
    protected <T> T CollectiongParameterToJSON(HttpServletRequest req,Class<T> tClass) throws IOException {
        StringBuilder stringBuilder=new StringBuilder();
        //把字节流(byte)转化为字符流(char)
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(req.getInputStream(),"UTF-8"));
        String str="";
        while ((str= bufferedReader.readLine())!=null){
            stringBuilder.append(str);
        }
        String strInfo= stringBuilder.toString();
        //转换json转化为java
        T obj=JSONObject.parseObject(strInfo.trim(), tClass);
        return obj;
    }

    /**
     * 使用反射来收集参数，并且返回给类型的实例化对象
     * @param req
     * @param tClass
     * @param <T>
     * @return
     */
    protected <T> T CollectiongParameterVlues(HttpServletRequest req,Class<T> tClass) throws InstantiationException, IllegalAccessException {
        //实例化对象
        Object obj = tClass.newInstance();

        //查看类中所有的变量定义
        Field[] declaredFields = tClass.getDeclaredFields();
        for (Field f : declaredFields) {
            //变量名
            String fieldName=f.getName();
            //变量类型
            Class fileType = f.getType();

            //取值求情订单值
            Object reqValue = getRequestParasValue(req, fieldName);
            //考虑特殊类型(string,int,double)以外的
           if (reqValue!=null){
               f.setAccessible(true);
               if (fileType == String.class){
                   f.set(obj,reqValue);
               }else if(fileType == Integer.class){
                    f.set(obj,Integer.parseInt(reqValue.toString()));
               }else if(fileType == Double.class){
                   f.set(obj,Double.parseDouble(reqValue.toString()));
               }else if (fileType == Date.class){
                   //单个日期 （日期复杂一点）
                   Date dt= DateUtils.parseDate(reqValue.toString());
                   f.set(obj,dt);
               }else if(fileType == BigDecimal.class){
                   f.set(obj,BigDecimal.valueOf(Double.valueOf(reqValue.toString())));
               }
           }
        }
        return  (T) obj;
    }

    /**
     * 查看请求是否有值
     * @param req
     * @param name
     * @return
     */
    private Object getRequestParasValue(HttpServletRequest req,String name){
        String[] values =req.getParameterValues(name);
        if (values!=null && values.length>0){
            if (values.length==1){
                return values[0];
            }else {
                return values;
            }
        }
        return null;
    }




/**
 * 向客户端输出字符串信息
 * @param json
  */
protected void render(HttpServletResponse resp,String json) throws IOException {
    //编码UTF-8
    resp.setCharacterEncoding("UTF-8");
    //格式为网页
    resp.setContentType("text/html;charset=UTF-8");
    //jsp内置对象(9个中的一个)
    PrintWriter out=resp.getWriter();
    out.print(json);
    out.flush();
    out.close();
}

/**
 * 判断新增修改删除，执行后的结果
 * @param count
 */
protected void crud(HttpServletResponse resp,int count) throws IOException {
    ResultAjax resultAjax;
    if (count>0){
        resultAjax=ResultAjax.success("操作成功");
    }else {
        resultAjax=ResultAjax.error("操作失败");
    }

    //转换为json格式
    String jsonString= JSONObject.toJSONString(resultAjax);
    this.render(resp, jsonString);
}

/**
 * 输出分页格式
 * @param resp
 * @param pageInfo
 * @throw IOException
 */
protected void render(HttpServletResponse resp, PageInfo pageInfo) throws IOException {
    //编码UTF-8
    resp.setCharacterEncoding("UTF-8");
    //格式为网页
    resp.setContentType("text/html;charset=UTF-8");

    //     转换成  rows:[] ,  total:总记录数
    ResultAjax resultAjax=ResultAjax.success_page(pageInfo);
    //把它转化为json格式
    String json = JSONObject.toJSONString(resultAjax);
    //jsp内置对象(9个中的一个)
    PrintWriter out=resp.getWriter();
    out.print(json);
    out.flush();
    out.close();

}


}
